# 云胡的编程周报第 012 期

时间:2023/10/30 - 2023/11/5

# 一、点滴记录

# 1

华为服务器调节风扇

  1. 用网线将 iBMC 远程管理端口连到路由器上,得知这个 IP
  2. ssh 登录到这个 IP 中。
  3. 将风扇模式设置为手动 ipmcset -d fanmode -v 1 100000000
  4. 将风扇转速设为 20%ipmcset -d fanlevel -v 20

# 2

2048 排行榜 bug 问题:有时候玩游戏,发现凌晨一点多提交的数据竟然没有在日榜上,理论上过了晚上 0 点就必须在日榜上。排错过程如下:

  1. 检查后端代码是否正确,在本地上测了无误。
  2. 检查 Linux 系统时区和 mysql 时区,无误。
  3. 不在 docker 里面运行后端,直接 java -jar 运行,发现无误,定位到问题出在 docker 里面。
  4. docker 是有时区的,默认与宿主机一样,但是不知道为什么这边它并没有与宿主机相同。有两种解决方式:
    • 在创建容器时候加上指定时区即可 docker run -e TZ=Asia/Shanghai
    • Dockerfile 中指定时区
# 设置时区为"Asia/Shanghai"
ENV TZ=Asia/Shanghai

# 安装时区工具
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && apt-get install -y tzdata
1
2
3
4
5

# 3

Python 识别文本语言

from langid.langid import LanguageIdentifier, model

def recognize_text_language(text):
    lang_identifier = LanguageIdentifier.from_modelstring(model, norm_probs=True)
    language, confidence = lang_identifier.classify(text)
    # 语言代码
    print(language)
    # 置信度,越高说明准确率越高
    print(confidence)
    print('')

if __name__ == "__main__":
    recognize_text_language("我是云胡")
    recognize_text_language("My name is yunhu")
    recognize_text_language("私は雲胡です")
    recognize_text_language("나는 윤후입니다")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

输出:

zh
0.9999608221084119

en
0.9992555904839872

ja
1.0

ko
1.0
1
2
3
4
5
6
7
8
9
10
11

这里的 zhenISO 639-1中的语言代码,用两个字母来标示世界上主要的语言,zh表示中文,en表示英文,更多语种信息可以去 ISO 639-1维基百科词条上查看。

# 4

OpenCVcv2.putText()无法显示中文,于是先用 PIL显示,再转为 OpenCV 对象。

def cv2_img_add_chinese_text(img, text, left, top, textColor=(0, 255, 0), textSize=20):
    """
    中文文本显示
    :param img: 图像
    :param text: 文本
    :param left: 起始点坐标
    :param top: 起始点坐标
    :param textColor: 文本颜色
    :param textSize: 文本字体大小
    :return: opencv 图像
    """
    # 判断是否是OpenCV 图片类型
    if isinstance(img, np.ndarray):
        # 将 OpenCV 格式转换为 PIL 图像格式
        # OpenCV 的颜色通道顺序是 BGR, PIL 是 RGB, 所以要先转换一下
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

    # 创建一个绘图对象
    draw = ImageDraw.Draw(img)
    # 创建一个字体对象, simsun.ttc 是宋体的字体文件,windows 系统在 'C:\Windows\Fonts' 路径下可找到
    fontText = ImageFont.truetype("../Font/simsun.ttc", textSize, encoding="utf-8")
    # 在图像上绘制文本
    draw.text((left, top), text, textColor, fontText)
    # 转回 BGR
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 5

numpy 的一维数组存到数据库

# encode 是一个一维数组,有 128 个元素
# 将 NumPy 数组编码为 Base64 字符串,然后将其解码为 UTF-8 文本字符串
encode_string = base64.b64encode(encode).decode('utf-8')
1
2
3

取出

def base64_to_numpy_array(image_feature):
    """
    将从数据库中读取的 base64 转为 numpy 数组
    :return:
    """
    # 解码成二进制数据
    decoded_image_feature = base64.b64decode(image_feature.encode('utf-8'))

    # 将原始二进制数据转换为 NumPy 数组
    image_feature = np.frombuffer(decoded_image_feature, dtype=np.float32)
    # 还原成一个有 128 个元素的一维数组
    image_feature = image_feature.reshape((128,))
    return image_feature
1
2
3
4
5
6
7
8
9
10
11
12
13

# 6

Python 要确保脚本中的文本输出是以 UTF-8 编码进行

import sys

sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf-8', buffering=1)
1
2
3

# 7

Spring Boot 运行 Python 脚本

@GetMapping("/test/executePython")
public String executePython() throws IOException, InterruptedException {
    // 第一个是 Python 解释器的路径,第二个是脚本路径
    String[] arguments = new String[] {"C:\\ProgramData\\anaconda3\\envs\\tensorflow2\\python.exe", "D:\\YunhuCodeProject\\PythonProject\\face-recognition\\detect.py"};
    Process proc;
    try {
        // 执行 py 文件
        proc = Runtime.getRuntime().exec(arguments);
        // 用输入输出流来截取结果
        FileInputStream fileInputStream = (FileInputStream)proc.getErrorStream();
        if (Objects.nonNull(fileInputStream)) {
            String line = null;
            BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream,StandardCharsets.UTF_8));
            StringBuilder output = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
                output.append(line).append("\n");
            }

            // waitFor 是用来显示脚本是否运行成功,1 表示失败,0 表示成功
            int re = proc.waitFor();
            System.out.println(re);
            return String.valueOf(re);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 8

在终端中通过 conda 运行 python 文件

conda run -n my_env_name python test.py
1

my_env_nameconda 环境的名称。

# 9

本地连接远程 redis

redis-cli -h xxx.xxx.xxx.xxx -p 6379
1

# 10

PythonMySql 数据库操作时,查询操作不需要执行 commit,只有在执行插入或更新操作后才需要。

# 二、发现

# 1

清华大学开源软件镜像站

https://mirrors.tuna.tsinghua.edu.cn/ (opens new window)

# 2

绘图工具

https://excalidraw.com/ (opens new window)

# 3

能不能好好说话?

https://lab.magiconch.com/nbnhhsh/ (opens new window)

识别缩写。